package com.pe.pgn.clubpgn.webapp.controller.Promocion;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.domain.ClpmPeriodoPromocion;
import com.pe.pgn.clubpgn.domain.ClpmPromocionPuntos;
import com.pe.pgn.clubpgn.domain.ClpmRangoPromocion;
import com.pe.pgn.clubpgn.domain.beans.BNPromocionEstacion;
import com.pe.pgn.clubpgn.domain.beans.BNRepetirPeriodo;
import com.pe.pgn.clubpgn.service.PromocionPuntosService;
import com.pe.pgn.clubpgn.webapp.controller.BaseFormController;

/**
 * @author Edwin Farfan
 */
@Controller
@RequestMapping("/promocionPuntos/**")
public class PromocionPuntosController extends BaseFormController{


	@Autowired
	private PromocionPuntosService service;
	
	
	@RequestMapping(value = "/promocionPuntosList.html")
    public void  listarClientesPersonas(ModelMap modelMap) {

		List<ClpmPromocionPuntos> promociones = service.obtenerPromocionesPuntos();
		modelMap.addAttribute("promocionPuntos", promociones);
		modelMap.addAttribute("fecha_inicio_date_format", CLPConstantes.DATE_PATTERN);
		modelMap.addAttribute("fecha_fin_date_format", CLPConstantes.DATE_PATTERN);
		modelMap.addAttribute("periodo_date_format", CLPConstantes.DATE_PATTERN);
		
//		return "/promocionPuntos/promocionPuntosList";
    }
	
	
	@RequestMapping(value = "/promocionPuntosForm.html", method = RequestMethod.GET)
	public @ModelAttribute("promocionPuntos") ClpmPromocionPuntos verPromocionPuntos(
				@RequestParam(value = "id", required = false) Long id, Model modelMap, 
				HttpServletRequest request) {

		List<ClpmPeriodoPromocion>periodosPromocion= service.listadoPeriodosPromocion(); 
		modelMap.addAttribute("periodosPromocion", periodosPromocion);
		modelMap.addAttribute("listaNumeros", listaNumeros(1,30));
			
		if (id != null) {
//			modelMap.addAttribute("listaDiasPromocion", service.listadoDiasPromocion(id));
			ClpmPromocionPuntos promocion= service.obtenerPromocionPuntos(id);
			return promocion;
		}
		return new ClpmPromocionPuntos();
	}

	@RequestMapping(value = "/promocionPuntosForm.html", method = RequestMethod.POST)
	public String guardarPromocionPuntos(@ModelAttribute("promocionPuntos") ClpmPromocionPuntos promocionPuntos,
			BindingResult result, SessionStatus status, HttpServletRequest request, Model model) {
		
		String retorno = null;
		if (promocionPuntos.getId() != null){
			retorno = "redirect:promocionPuntosForm.html&id="+promocionPuntos.getId();
		}else{
			retorno = "redirect:promocionPuntosForm.html?method=Add&from=list";
		}
		
		try {
			if((promocionPuntos.getId()== null) &&	(service.translapePromocion(promocionPuntos))){
				saveError(request, getText("promocion.puntos.translape", request.getLocale()));
				model.addAttribute("promocionPuntos", promocionPuntos);
				return retorno;
			}
			
			boolean rangos = promocionPuntos.isStRango();
			if(!rangos && promocionPuntos.getId()!= null){
				service.eliminarRangoByPromocion(promocionPuntos.getId());
			}
			
			service.guardarPromocionPuntos(promocionPuntos);
			saveMessage(request, getText("promocion.puntos.added", 
					promocionPuntos.toString(), request.getLocale()));
			return "redirect:promocionPuntosList.html";
		} catch (Exception e) {
			saveError(request, getText("errors.general", request.getLocale()));
			model.addAttribute("promocionPuntos", promocionPuntos);
			return retorno;
		}
	}

	@RequestMapping(value = "/eliminarPromocionPuntos.html")
	public String eliminarPromocionPuntos(@RequestParam(value = "id", required = true) Long id, 
			HttpServletRequest request) {
		try {
			if(service.eliminarPromocionPuntos(id)){
				saveMessage(request, getText("promocion.puntos.deleted", request.getLocale()));
				return "redirect:promocionPuntosList.html";
			}
			else{
				saveError(request, getText("promocion.puntos.no.deleted", request.getLocale()));
				if(service.vigenciaPromocion(id)){
					saveError(request, getText("promocion.puntos.vigente", request.getLocale()));
				}
				return "redirect:promocionPuntosForm.html";
			}
		} catch (Exception e) {
			saveError(request, getText("errors.general", request.getLocale()));
			return "redirect:promocionPuntosForm.html";
		}
	}		
	
	@RequestMapping(value="/agregarEstaciones.html")
	public String agregarEstaciones(@RequestParam(value = "id", required = true) Long id,
			ModelMap modelMap){
		List<BNPromocionEstacion> listadoPromocionEstacion= service.listadoPromocionEstacion(id);
		List<BNPromocionEstacion> filtroPromocionEstacion= new ArrayList<BNPromocionEstacion>();
		ClpmPromocionPuntos promocionPuntos= service.obtenerPromocionPuntos(id);
		int sizeRows=0;
		
		for (BNPromocionEstacion bnPromocionEstacion : listadoPromocionEstacion) {
			boolean flatEstacion=bnPromocionEstacion.getStPromocionEstacion().equals(CLPConstantes.ST_VERDADERO)?true:false;
			bnPromocionEstacion.setEstacionBool(flatEstacion);
			if(StringUtils.isBlank(bnPromocionEstacion.getPromocionEstacion())){
				bnPromocionEstacion.setPromocionEstacion(CLPConstantes.ZERO);
			}
			filtroPromocionEstacion.add(bnPromocionEstacion);
		}
		modelMap.addAttribute("promocionPuntos", promocionPuntos);
		sizeRows=filtroPromocionEstacion.size();
		modelMap.addAttribute("sizeList",sizeRows);
		modelMap.addAttribute("promocionEstaciones", filtroPromocionEstacion);
		return "/promocionPuntos/estaciones/promocionPuntosEstaciones";
	}
	

	@RequestMapping(value = "/rangosPromocion.html")
	public String verRangosPromocion(@RequestParam(value = "id", required = true) Long id, 
			ModelMap modelMap) {

		List<ClpmRangoPromocion> listadoRangos = service.listarRangoPromocion(id);
		ClpmPromocionPuntos promocionPuntos= service.obtenerPromocionPuntos(id);
		
		modelMap.addAttribute("listadoPromocion", listadoRangos);
		modelMap.addAttribute("rangoPromocion", new ClpmRangoPromocion());
//		modelMap.addAttribute("idPromocionPuntos", id);
		modelMap.addAttribute("promocionPuntos", promocionPuntos);
		
		return "/promocionPuntos/rangos/promocionPuntosRangos";
	}		
	
	 private List<BNRepetirPeriodo> listaNumeros(Integer inicio, Integer fin){
		 
		 List<BNRepetirPeriodo> listNumbers=new ArrayList<BNRepetirPeriodo>();
		 for (int i = inicio; i <= fin; i++) {
			 BNRepetirPeriodo bnRepetirPeriodo=new BNRepetirPeriodo();
			 bnRepetirPeriodo.setId(i);
			 bnRepetirPeriodo.setLabel(String.valueOf(i));
			listNumbers.add(bnRepetirPeriodo);
		}
		 return listNumbers;
	 }
	
	 @RequestMapping(value = "/guardarestacionesform.html")
	 public String guardarEstaciones(@RequestParam(value = "id", required = true) Long id,
				ModelMap modelMap, HttpServletRequest request) {

			saveMessage(request, getText("promocionPuntos.estaciones.added", request.getLocale()));
			return "redirect:agregarEstaciones.html?id=" + id;

	 }
	
}
